軟體開發在經過那麼長時間的發展,對於「命名」這件事從來都沒有一個定論過,一直都有一些很特別的命名發展出來。今天我們說一些有聽過或有看過的命名規則。
匈牙利命名法在這個世紀初期還算是個很有名的命名法,簡單的說就是他要把這個參數的屬性放在名稱的最前面,例如:
int iCount = 10;
為什麼要這樣做呢?主要有幾個原因。
目前其實在兩個地方還是看得到匈牙利命名法,例如ASP.Net,還是會看到像這樣的寫法:
if(txtUsername.Text == "" || txtPassword.Text == "")
return false;
前面用txt就是暗示這個欄位是個"文字框"
另外一個地方是比較常見的Interface,目前習慣的做法還是這樣命名:
interface IUser
前面的I就是暗示這是個Interface
這種命名法在編輯器比較好用的語言,或者比較新式的開發方法己經比較少見,大部份的情況己經不會用到匈牙利命名法,即使是微軟曾經那麼喜歡用匈牙利命名法,目前的Code convention也是建議不要使用。
Pascal Case是目前主流的命名法之一,主要就是讓所有的字母的首字母都是大寫,例如:
public class UserLoginHistory
{
}
這個方法普遍用在各種的程式語言中,主要是因為很容易分辨整個命名的意義,即使不是英語為母語的人士都能理解參數要表達的意思。也因為他是全首字大寫,因此比較常會用在class name或者相同層級的名稱,例如Enum:
public enum UserLevel
{
Basic, Advanced, VIP
}
或者物件的公開屬性及方法名稱,也會使用Pascal Case
public class UserDetail
{
public int UserName{ get; set; }
}
和Pascal Case相對的就是Camel Case,它把首字母的大寫改成小寫,其他字的首字母都是大寫,例如:
public void TestMethod()
{
UserDetail userDetail = new UserDetail();
userDetail.UserName = "John Doe";
}
因為class是Pascal Case,因此object name用Camel Case,就可以看出他們的相互關係。
雖然不能說是「相對的」,但通常Camel Case會成對的出現,只是看怎麼對比,例如Java的class name會用Pascal,但class下的方法會用Camel,C#則將所有class內的定義都使用Pascal,使用的時候才用Camel。
大寫的驚訝,無論在那種語言都是誇張表現的一部份,SCREAM CASE這種全大寫的使用,也是在一些比較特別的情況。例如常數:
public class WorkingArea
{
static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;
}
在寫C語言的巨集或Preprocessor的時候,也會用到SCREAM CASE
#define MAX(a, b) ((a) > (b) ? (a) : (b))
如果有什麼需要特別吸引到大眾注意的時候,也會使用SCREAM CASE,例如Log的內容,或者輸出時要特別讓人注意時。不過也因為太吸引眼球,使用時要特別注意。
有些命名規則,會將每個字用不同的分隔符號分開,常見的有連字符(-)或底線( _ ),這兩種都有著很好的可讀性。目前Kebab Case愈來愈常見:就是每個字用"-"分開,例如Vue.js,就推荐使用Kebab-Case
Vue.component('todo-item', {
// ...
})
另外還有很多種的命名方法,但比較常見的就是以上幾種,但無論是那種命名法,最重要的目的就是可讀性。例如下面這個例子,就是一個非常不好的例子:在一個方法裡混用了各種的命名法:
因此如果團隊裡己經有訂定好的命名規則,就應該遵守那個規則:命名可以發揮創意,但不要發揮在命名法上面。如果不知道那個才對,應該向自己的主管或資深的同事請教,如果他們不置可否怎麼辦?